package com.soms.service.impl;

import cn.hutool.json.JSONUtil;
import com.soms.dao.UserDao;
import com.soms.dao.impl.UserDaoImpl;
import com.soms.entity.User;
import com.soms.service.UserService;
import com.soms.util.DBUtil;
import com.soms.util.DateUtil;
import com.soms.util.ResultUtil;

import java.sql.Connection;
import java.util.Map;
import java.util.Objects;

public class UserServiceImpl implements UserService {
    private final UserDao userDao = new UserDaoImpl();

    /**
     * 能不能登录，如果不能，原因是什么
     *
     * @param userCode
     * @param userPassword
     */
    @Override
    public Map<String, Object> doLogin(String userCode, String userPassword) {
        // 常规校验
        if (userCode == null || Objects.equals(userCode, "")) {
            return ResultUtil.fail("请填写用户名");
        }
        if (userPassword == null || Objects.equals(userPassword, "")) {
            return ResultUtil.fail("请填写密码");
        }
        // 比对数据库
        Connection connection = DBUtil.getConnection();
        boolean loginFlag = userDao.doLogin(connection, userCode, userPassword);
        if (loginFlag) {
            return ResultUtil.success();
        } else {
            return ResultUtil.fail("用户名或密码错误");
        }
    }

    /**
     * 根据用户编码查询用户信息
     *
     * @param userCode
     * @return
     */
    @Override
    public User getUserByUserCode(String userCode) {
        Connection connection = DBUtil.getConnection();
        User user = userDao.getUserByUserCode(connection, userCode);
        DBUtil.closeConnection(connection);
        return user;
    }

    /**
     * 登录用户上传头像，保存图片的base64编码
     *
     * @param userCode
     * @param avatar
     * @return
     */
    @Override
    public String uploadAvatar(String userCode, String avatar) {
        Connection connection = DBUtil.getConnection();
        int result = userDao.uploadAvatar(connection, userCode, avatar);
        DBUtil.closeConnection(connection);
        if (result > 0) {
            return JSONUtil.toJsonStr(ResultUtil.success());
        } else {
            return JSONUtil.toJsonStr(ResultUtil.error());
        }
    }

    /**
     * 获取当前登录用户的头像
     *
     * @param userCode
     * @return
     */
    @Override
    public String getAvatar(String userCode) {
        Connection connection = DBUtil.getConnection();
        String avatar = userDao.getAvatar(connection, userCode);
        DBUtil.closeConnection(connection);
        if (Objects.isNull(avatar) || Objects.equals(avatar, "")) {
            return JSONUtil.toJsonStr(ResultUtil.fail("用户还没有头像"));
        } else {
            return JSONUtil.toJsonStr(ResultUtil.success(null, avatar));
        }
    }

    /**
     * 修改密码
     *
     * @param userCode
     * @param oldPassword
     * @param newPassword
     * @param rePassword
     * @return
     */
    @Override
    public String updatePassword(String userCode, String oldPassword, String newPassword, String rePassword) {
        Connection connection = DBUtil.getConnection();
        // 校验原密码是否正确，本质在使用userCode和oldPassword来做登录校验
        if (!userDao.doLogin(connection, userCode, oldPassword)) {
            DBUtil.closeConnection(connection);
            return JSONUtil.toJsonStr(ResultUtil.fail("原密码错误"));
        }
        if (Objects.equals(newPassword, oldPassword)) {
            DBUtil.closeConnection(connection);
            return JSONUtil.toJsonStr(ResultUtil.fail("密码没有变化"));
        }
        // 校验新密码
        if (!newPassword.matches("^[a-zA-Z]\\w{5,14}$")) {
            DBUtil.closeConnection(connection);
            return JSONUtil.toJsonStr(ResultUtil.fail("密码必须以字母开头，长度在6~15之间，只能包含字母、数字和下划线"));
        }
        // 校验确认密码
        if (!Objects.equals(newPassword, rePassword)) {
            DBUtil.closeConnection(connection);
            return JSONUtil.toJsonStr(ResultUtil.fail("确认密码和新密码不一致"));
        }
        // 数据库修改
        int result = userDao.updatePassword(connection, userCode, newPassword);
        DBUtil.closeConnection(connection);
        if (result > 0) {
            return JSONUtil.toJsonStr(ResultUtil.success());
        } else {
            return JSONUtil.toJsonStr(ResultUtil.error());
        }
    }

    /**
     * 用户自己修改个人信息
     *
     * @param user
     * @return
     */
    @Override
    public String updateUserBySelf(User user) {
        if (user.getUserName() == null || Objects.equals(user.getUserName(), "")) {
            return JSONUtil.toJsonStr(ResultUtil.fail("用户名不能为空"));
        }
        if (user.getUserName().length() > 15) {
            return JSONUtil.toJsonStr(ResultUtil.fail("用户名不能超过15个字符"));
        }
        if (user.getPhone() != null && user.getPhone().length() > 15) {
            return JSONUtil.toJsonStr(ResultUtil.fail("电话号码不能超过15个字符"));
        }
        if (user.getAddress() != null && user.getAddress().length() > 30) {
            return JSONUtil.toJsonStr(ResultUtil.fail("地址不能超过30个字符"));
        }
        Connection connection = DBUtil.getConnection();
        // 判断用户名是否被其他用户所使用
        if (userDao.checkUserNameExist(connection, user.getUserCode(), user.getUserName())) {
            DBUtil.closeConnection(connection);
            return JSONUtil.toJsonStr(ResultUtil.fail("用户名已被占用"));
        }
        // 获取当前用户id，作为修改人
        User loginUser = userDao.getUserByUserCode(connection, user.getUserCode());
        user.setModifier(loginUser.getId());
        // 获取当前时间
        user.setModified(DateUtil.nowDateTimeString());
        int result = userDao.updateUserBySelf(connection, user);
        DBUtil.closeConnection(connection);
        if (result > 0) {
            return JSONUtil.toJsonStr(ResultUtil.success());
        } else {
            return JSONUtil.toJsonStr(ResultUtil.error());
        }
    }
}
